// 用户控制器 - 处理用户相关的业务逻辑
const expressModule = require('../zh/后端/Express');
const 用户服务 = require('../services/userService');

/**
 * 用户控制器类 - 适配Sequelize和封装的数据库操作
 */
class 用户控制器 {
  /**
   * 获取用户信息
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static async 获取用户信息(请求, 响应) {
    try {
      const 用户ID = parseInt(expressModule.获取请求参数(请求, 'id'));
      
      // 验证ID格式
      if (isNaN(用户ID)) {
        expressModule.设置状态码(响应, 400);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '无效的用户ID'
        });
      }
      
      // 使用服务层获取用户信息
      const 用户 = await 用户服务.根据ID查找用户(用户ID);
      
      if (用户) {
        // 移除密码信息
        const { 密码, ...返回数据 } = 用户;
        
        expressModule.发送JSON(响应, {
          success: true,
          data: 返回数据,
          message: '获取用户信息成功'
        });
      } else {
        expressModule.设置状态码(响应, 404);
        expressModule.发送JSON(响应, {
          success: false,
          message: '用户不存在'
        });
      }
    } catch (错误) {
      console.error('获取用户信息失败:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: '服务器错误'
      });
    }
  }

  /**
   * 用户登录处理
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static async 用户登录(请求, 响应) {
    try {
      const 用户名 = expressModule.获取请求体(请求, 'username') || expressModule.获取请求体(请求, '用户名');
      const 密码 = expressModule.获取请求体(请求, 'password') || expressModule.获取请求体(请求, '密码');
      
      // 验证输入
      if (!用户名 || !密码) {
        expressModule.设置状态码(响应, 400);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '用户名和密码不能为空'
        });
      }
      
      // 使用服务层进行登录验证
      const 登录结果 = await 用户服务.用户登录(用户名, 密码);
      
      // 移除密码信息
      const { 密码: 密码字段, ...用户数据 } = 登录结果.用户;
      
      // 设置Session和Cookie
      expressModule.设置Session数据(请求, 'user', 用户数据);
      
      expressModule.发送JSON(响应, {
        success: true,
        data: 用户数据,
        message: '登录成功'
      });
    } catch (错误) {
      console.error('用户登录失败:', 错误);
      expressModule.设置状态码(响应, 401);
      expressModule.发送JSON(响应, {
        success: false,
        message: 错误.message || '用户名或密码错误'
      });
    }
  }

  /**
   * 用户登出处理
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static 用户登出(请求, 响应) {
    try {
      expressModule.销毁Session(请求);
      expressModule.清除Cookie(响应, 'user_token');
      expressModule.发送JSON(响应, {
        success: true,
        message: '登出成功'
      });
    } catch (错误) {
      console.error('登出失败:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: '登出失败，请重试'
      });
    }
  }

  /**
   * 获取当前用户信息
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static 获取当前用户(请求, 响应) {
    const 用户 = expressModule.获取Session数据(请求, 'user');
    
    if (!用户) {
      expressModule.设置状态码(响应, 401);
      return expressModule.发送JSON(响应, {
        success: false,
        message: '未登录'
      });
    }
    
    expressModule.发送JSON(响应, {
      success: true,
      data: 用户,
      message: '获取当前用户信息成功'
    });
  }

  /**
   * 获取用户列表
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static async 获取用户列表(请求, 响应) {
    try {
      // 获取查询参数
      const 查询条件 = {
        角色: expressModule.获取查询参数(请求, '角色') || expressModule.获取查询参数(请求, 'role'),
        状态: expressModule.获取查询参数(请求, '状态') || expressModule.获取查询参数(请求, 'status'),
        搜索: expressModule.获取查询参数(请求, '搜索') || expressModule.获取查询参数(请求, 'search'),
        页码: expressModule.获取查询参数(请求, '页码') || expressModule.获取查询参数(请求, 'page'),
        每页数量: expressModule.获取查询参数(请求, '每页数量') || expressModule.获取查询参数(请求, 'pageSize')
      };
      
      // 使用服务层获取用户列表
      const 结果 = await 用户服务.获取用户列表(查询条件);
      
      // 移除密码信息
      结果.列表 = 结果.列表.map(用户 => {
        const { 密码, ...用户信息 } = 用户;
        return 用户信息;
      });
      
      expressModule.发送JSON(响应, { 
        success: true, 
        data: 结果,
        message: '获取用户列表成功'
      });
    } catch (错误) {
      console.error('获取用户列表失败:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: 错误.message || '服务器错误'
      });
    }
  }

  /**
   * 禁用用户
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static async 禁用用户(请求, 响应) {
    try {
      const 用户ID = parseInt(expressModule.获取请求参数(请求, 'id'));
      
      // 验证ID格式
      if (isNaN(用户ID)) {
        expressModule.设置状态码(响应, 400);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '无效的用户ID'
        });
      }
      
      // 使用服务层禁用用户
      const 成功 = await 用户服务.禁用用户(用户ID);
      
      if (成功) {
        expressModule.发送JSON(响应, {
          success: true,
          message: '用户已禁用'
        });
      } else {
        expressModule.设置状态码(响应, 404);
        expressModule.发送JSON(响应, {
          success: false,
          message: '用户不存在'
        });
      }
    } catch (错误) {
      console.error('禁用用户失败:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: '服务器错误'
      });
    }
  }

  /**
   * 启用用户
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static async 启用用户(请求, 响应) {
    try {
      const 用户ID = parseInt(expressModule.获取请求参数(请求, 'id'));
      
      // 验证ID格式
      if (isNaN(用户ID)) {
        expressModule.设置状态码(响应, 400);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '无效的用户ID'
        });
      }
      
      // 使用服务层启用用户
      const 成功 = await 用户服务.启用用户(用户ID);
      
      if (成功) {
        expressModule.发送JSON(响应, {
          success: true,
          message: '用户已启用'
        });
      } else {
        expressModule.设置状态码(响应, 404);
        expressModule.发送JSON(响应, {
          success: false,
          message: '用户不存在'
        });
      }
    } catch (错误) {
      console.error('启用用户失败:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: '服务器错误'
      });
    }
  }

  /**
   * 获取当前用户会话信息
   * @param {Object} 请求 - Express请求对象
   * @param {Object} 响应 - Express响应对象
   */
  static 获取会话信息(请求, 响应) {
    const 用户 = expressModule.获取Session数据(请求, 'user');
    
    if (!用户) {
      expressModule.设置状态码(响应, 401);
      return expressModule.发送JSON(响应, {
        success: false,
        message: '未登录'
      });
    }
    
    expressModule.发送JSON(响应, {
      success: true,
      data: 用户,
      message: '获取会话信息成功'
    });
  }
}

module.exports = 用户控制器;